import hashlib
import os
import logging
from typing import Optional

# 配置日志记录器
logger = logging.getLogger("utils")


def gen_node_id() -> bytes:
    """生成一个随机的20字节节点ID
    
    使用sha1哈希函数生成节点ID，确保长度为20字节
    
    Returns:
        bytes: 20字节的节点ID
        
    Example:
        >>> node_id = gen_node_id()
        >>> len(node_id) == 20
        True
    """
    try:
        return hashlib.sha1(os.urandom(20)).digest()
    except Exception as e:
        logger.error(f"生成节点ID失败: {str(e)}")
        raise

def gen_transaction_id() -> bytes:
    """生成一个随机的2字节事务ID
    
    生成唯一的事务ID并缓存，防止重复使用
    
    Returns:
        bytes: 2字节的事务ID
        
    Raises:
        RuntimeError: 如果无法生成唯一事务ID
        
    Example:
        >>> tid = gen_transaction_id()
        >>> len(tid) == 2
        True
    """

    return os.urandom(2)
    

def gen_info_hash() -> bytes:
    """生成一个20字节的info_hash
    
    使用sha1哈希函数生成info_hash，确保长度为20字节
    
    Returns:
        bytes: 20字节的info_hash
        
    Example:
        >>> info_hash = gen_info_hash()
        >>> len(info_hash) == 20
        True
    """
    try:
        return hashlib.sha1(os.urandom(20)).digest()
    except Exception as e:
        logger.error(f"生成info_hash失败: {str(e)}")
        raise

def is_valid_node_id(node_id: Optional[bytes]) -> bool:
    """验证节点ID是否有效
    
    Args:
        node_id: 要验证的节点ID
        
    Returns:
        bool: 节点ID是否有效
    """
    return bool(node_id and len(node_id) == 20)

def is_valid_info_hash(info_hash: Optional[bytes]) -> bool:
    """验证info_hash是否有效
    
    Args:
        info_hash: 要验证的info_hash
        
    Returns:
        bool: info_hash是否有效
    """
    return bool(info_hash and len(info_hash) == 20)